package utilitarios;

import java.text.DateFormatSymbols;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import negocio.NegocioException;


public class DataHora {
    
	private static SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
	private static SimpleDateFormat formatCompleto = new SimpleDateFormat("EEEEE dd MMMMM yyyy");
	private static SimpleDateFormat tFormat = new SimpleDateFormat("HH:mm:ss");
	private static SimpleDateFormat anoFormat = new SimpleDateFormat("yyyy");
	
	public static Date stringParaData(String data) {
		try {
			return format.parse(data);
		} catch (ParseException e) {
			throw new IllegalArgumentException(e.getMessage());
		}
	}
	
	public static Date stringParaHora(String hora) {
		try {
			return tFormat.parse(hora);
		} catch (ParseException e) {
			throw new IllegalArgumentException(e.getMessage());
		}
	}
	
	public static String dataParaString(Date data){
		return format.format(data);
	}

	public static Date stringParaAno(String data) {
		try {
			return anoFormat.parse(data);
		} catch (ParseException e) {
			throw new IllegalArgumentException(e.getMessage());
		}
	}
	
	
	public static String getDataHoje() {
		try {
			Date date = new Date();
			return format.format(date);
		} catch (Exception e) {
			return null;
		}
	}

	public static String getDataCompleta(String data) {
		try {
			return formatCompleto.format(stringParaData(data));
		} catch (Exception e) {
			return null;
		}
	}

	
	public static String getHora(){
		try {
			Date date = new Date();
			return tFormat.format(date);
		} catch (Exception e) {
			return null;
		}
	}
	
	public static String getAno(String data){
		try {
			return anoFormat.format(data);
		} catch (Exception e) {
			return null;
		}
	}
	
	public static String converteDia(String diaSemana)throws NegocioException{
		if(diaSemana.equalsIgnoreCase("Segunda-feira")){
			return "1";
		}else if(diaSemana.equalsIgnoreCase("Ter�a-feira")){
			return "2";
		}else if(diaSemana.equalsIgnoreCase("Quarta-feira")){
			return "3";
		}else if(diaSemana.equalsIgnoreCase("Quinta-feira")){
			return "4";
		}else if(diaSemana.equals("Sexta-feira")){
			return"5";
		}else if(diaSemana.equalsIgnoreCase("S�bado")){
			return "6";
		}else if(diaSemana.equalsIgnoreCase("Domingo")){
			return "7";
		}
		throw new NegocioException("Opera��o inv�lida - n�o � possivel converter a data expecificada");
	}
	
	public static String dataParaDiaSemana(String dia)throws NegocioException{
		String[] DIA_SEMANA_EXTENSO = new DateFormatSymbols(new Locale("pt", "BR")).getWeekdays();
		Date date = null;
		String formato = "dd/MM/yyyy";
		SimpleDateFormat df = new SimpleDateFormat(formato);
		try {
			date = df.parse(dia);
			GregorianCalendar c = (GregorianCalendar) GregorianCalendar.getInstance();
			c.setTime(date);
			return DIA_SEMANA_EXTENSO[c.get(GregorianCalendar.DAY_OF_WEEK)];
		} catch (ParseException e) {
			throw new NegocioException("Erro ao converter data"+e);
		}
		
	}
	
	/** 
	  * M�todo para comparar as das e retornar o numero de dias de diferen�a entre elas 
	  * 
	  * Compare two date and return the difference between them in days. 
	  * 
	  * @param dataLow The lowest date 
	  * @param dataHigh The highest date 
	  * @author Renan
	  * @return int 
	  */  
	
	public static int dataDiff(java.util.Date dataLow, java.util.Date dataHigh){  
		  
	     GregorianCalendar startTime = new GregorianCalendar();  
	     GregorianCalendar endTime = new GregorianCalendar();  
	       
	     GregorianCalendar curTime = new GregorianCalendar();  
	     GregorianCalendar baseTime = new GregorianCalendar();  
	  
	     startTime.setTime(dataLow);  
	     endTime.setTime(dataHigh);  
	       
	     int dif_multiplier = 1;  
	       
	     // Verifica a ordem de inicio das datas  
	     if( dataLow.compareTo( dataHigh ) < 0 ){  
	         baseTime.setTime(dataHigh);  
	         curTime.setTime(dataLow);  
	         dif_multiplier = 1;  
	     }else{  
	         baseTime.setTime(dataLow);  
	         curTime.setTime(dataHigh);  
	         dif_multiplier = -1;  
	     }  
	       
	     int result_years = 0;  
	     int result_months = 0;  
	     int result_days = 0;  
	  
	     // Para cada mes e ano, vai de mes em mes pegar o ultimo dia para import acumulando  
	     // no total de dias. Ja leva em consideracao ano bissesto  
	     while( curTime.get(GregorianCalendar.YEAR) < baseTime.get(GregorianCalendar.YEAR) ||  
	            curTime.get(GregorianCalendar.MONTH) < baseTime.get(GregorianCalendar.MONTH)  )  
	     {  
	           
	         int max_day = curTime.getActualMaximum( GregorianCalendar.DAY_OF_MONTH );  
	         result_months += max_day;  
	         curTime.add(GregorianCalendar.MONTH, 1);  
	           
	     }  
	       
	     // Marca que � um saldo negativo ou positivo  
	     result_months = result_months*dif_multiplier;  
	       
	       
	     // Retirna a diferenca de dias do total dos meses  
	     result_days += (endTime.get(GregorianCalendar.DAY_OF_MONTH) - startTime.get(GregorianCalendar.DAY_OF_MONTH));  
	       
	     return result_years+result_months+result_days;  
	}  

	
}
